package com.ldzy.webase.controller;

import com.auth0.jwt.JWT;
import com.ldzy.webase.annotation.PassToken;
import com.ldzy.webase.annotation.UserLoginToken;
import com.ldzy.webase.entity.Comment;
import com.ldzy.webase.entity.Press;
import com.ldzy.webase.service.PressService;
import com.ldzy.webase.utils.Response;
import com.ldzy.webase.utils.ResponseCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author ：Lq
 * @version ：1.0
 * @date ：2022/10/26 16:30
 * @description ：t_press-咨询表-控制层
 */
@RestController
@ResponseBody
@RequestMapping("/press")
public class PressController {
    @Autowired
    private PressService pressService;

    /**
     * @author ：Lq
     * @date ：2022/10/26 16:33
     * @description ：获取咨询列表
     * @Param press 可根据(consultId咨询类别id，uid用户编号，status状态)进行查询;也可不要参数，默认查询全部
     * 可分页查询
     */
    @GetMapping("/list")
    @PassToken
    public Response getPressAllByMore(@RequestParam(required = false) Integer consultId,
                                      @RequestParam(required = false) String status,
                                      @RequestParam(required = false) Integer pageNum,
                                      @RequestParam(required = false) Integer pageSize) {
        // new一个Press接收用于存放前端的请求参数
        Press press = new Press();
        press.setConsultId(consultId);
        press.setStatus(status);

        // 获取总数total
        int pressTotal = pressService.getPressTotalOrBy24Hour(press, false);

        // 获取咨询列表
        List<Press> pressAllByMore = pressService.getPressAllByMore(press, pageNum, pageSize);

        // 将数据封装一下，JSON格式为
        /*
         * data:{
         *   data:[
         *     total:9,
         *     rows:[....]
         *   ]
         */

        Map<String, Object> map = new HashMap<>();
        map.put("total", pressTotal);
        map.put("rows", pressAllByMore);

        // 将 数据 返回给前端
        return Response.build(ResponseCode.SUCCESS, map);
    }

    /**
     * @author ：Lq
     * @date ：2022/10/29 17:37
     * @description ：获取24小时内热门的咨询列表，可根据(用户编号，咨询类别，发布时间)进行查询;也可不要参数，默认查询全部
     */
    @GetMapping("/24Hour-hot/list")
    @PassToken
    public Response getPressByInterval24HourHot(@RequestParam(required = false) Integer consultId,
                                                @RequestParam(required = false) String status,
                                                @RequestParam(required = false) Integer pageNum,
                                                @RequestParam(required = false) Integer pageSize) {
        // new一个Press接收用于存放前端的请求参数
        Press press = new Press();
        press.setConsultId(consultId);
        press.setStatus(status);

        // 获取总数total
        int pressTotal = pressService.getPressTotalOrBy24Hour(press, true);

        // 获取咨询列表
        List<Press> pressByInterval24HourHot = pressService.getPressByInterval24HourHot(press, pageNum, pageSize);

        // 将数据封装一下
        Map<String, Object> map = new HashMap<>();
        map.put("total", pressTotal);
        map.put("rows", pressByInterval24HourHot);

        // 将 数据 返回给前端
        return Response.build(ResponseCode.SUCCESS, map);
    }

    /**
     * @author ：Lq
     * @date ：2022/10/29 17:40
     * @description ：获取历史最热门的咨询列表，可根据(用户编号，咨询类别，发布时间)进行查询;也可不要参数，默认查询全部
     */
    @GetMapping("/most-hot/list")
    @PassToken
    public Response getPressByMostHot(@RequestParam(required = false) Integer consultId,
                                      @RequestParam(required = false) String status,
                                      @RequestParam(required = false) Integer pageNum,
                                      @RequestParam(required = false) Integer pageSize) {
        // new一个Press接收用于存放前端的请求参数
        Press press = new Press();
        press.setConsultId(consultId);
        press.setStatus(status);

        // 获取总数total
        int pressTotal = pressService.getPressTotalOrBy24Hour(press, false);

        // 获取咨询列表
        List<Press> pressByMostHot = pressService.getPressByMostHot(press, pageNum, pageSize);

        // 将数据封装一下
        Map<String, Object> map = new HashMap<>();
        map.put("total", pressTotal);
        map.put("rows", pressByMostHot);

        // 将 数据 返回给前端
        return Response.build(ResponseCode.SUCCESS, map);
    }

    /**
     * @author ：Lq
     * @date ：2022/10/29 19:59
     * @description ：获取最新评论时间的咨询，可根据(consultId咨询类别，status状态，uid用户编号)进行查询;也可不要参数，可分页查询
     */
    @GetMapping("/newCommentDate/list")
    @PassToken
    public Response getPressByNewCommentDate(@RequestParam(required = false) Integer consultId,
                                             @RequestParam(required = false) String status,
                                             @RequestParam(required = false) Integer pageNum,
                                             @RequestParam(required = false) Integer pageSize) {
        // new一个Press接收用于存放前端的请求参数
        Press press = new Press();
        press.setConsultId(consultId);
        press.setStatus(status);

        // 获取总数total
        int pressTotal = pressService.getPressTotalOrBy24Hour(press, false);

        // 获取咨询列表
        List<Press> pressByNewCommentDate = pressService.getPressByNewCommentDate(press, pageNum, pageSize);

        // 将数据封装一下
        Map<String, Object> map = new HashMap<>();
        map.put("total", pressTotal);
        map.put("rows", pressByNewCommentDate);

        // 将 数据 返回给前端
        return Response.build(ResponseCode.SUCCESS, map);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/5 17:42
     * @description ：根据pressId，获取咨询的详情信息
     */
    @GetMapping("/press")
    @PassToken
    public Response getPressByPressId(@RequestParam("pressId") Integer pressId, HttpServletRequest httpServletRequest) {
        int uid = 0;

        // 从请求头中取出token
        String token = httpServletRequest.getHeader("Authorization");
        if (token != null && !token.equals("")) {
            // 从token中取出的uid，不需要担心是否为null，因为@UserLoginToken注解已经验证过了
            uid = Integer.parseInt(JWT.decode(token).getAudience().get(0));
        }

        // 获取咨询详情信息
        Press press = pressService.getPressByPressId(pressId, uid);

        // 将 数据 返回给前端
        return Response.build(ResponseCode.SUCCESS, press);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/2 11:05
     * @description ：发布资讯/话题 (成功返回1，否则返回0)
     * 请求头需要token参数
     */
    @PostMapping("/publishPress")
    @UserLoginToken
    public Response publishPress(@RequestBody Press press, HttpServletRequest request) {
        // 从请求头中取出token
        String token = request.getHeader("Authorization");
        // 从token中取出的uid，不需要担心是否为null，因为@UserLoginToken注解已经验证过了
        int uid = Integer.parseInt(JWT.decode(token).getAudience().get(0));

        // 将请求头中的uid存入
        press.setUid(uid);

        // 调用接口发布话题
        pressService.addPress(press);

        // 返回成功消息给前端
        return Response.build(ResponseCode.SUCCESS);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/5 15:10
     * @description ：获取资讯/话题评论列表
     */
    @GetMapping("/comment/list")
    @PassToken
    public Response getCommentInfoByPressId(@RequestParam(value = "pressId", required = false) Integer pressId,
                                            @RequestParam(required = false) Integer pageNum,
                                            @RequestParam(required = false) Integer pageSize) {
        // new一个Comment用来存放参数
        Comment comment = new Comment();
        comment.setPressId(pressId);

        // 获取评论列表
        List<Comment> commentByPressId = pressService.getCommentByPressId(comment, pageNum, pageSize);

        // 将 数据 返回给前端
        return Response.build(ResponseCode.SUCCESS, commentByPressId);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/5 14:56
     * @description ：咨询点赞操作-数据库中有使用联合唯一索引，所以会有重复的点赞会自动排除
     */
    @PutMapping("/like")
    @UserLoginToken
    public Response pressLike(@RequestParam("pressId") Integer pressId, HttpServletRequest httpServletRequest) {
        // 从请求头中取出token
        String token = httpServletRequest.getHeader("Authorization");
        // 从token中取出的uid，不需要担心是否为null，因为@UserLoginToken注解已经验证过了
        int uid = Integer.parseInt(JWT.decode(token).getAudience().get(0));

        // 调用接口给咨询点赞
        pressService.addPressLike(pressId, uid);

        // 返回成功消息给前端
        return Response.build(ResponseCode.SUCCESS);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/5 18:31
     * @description ：咨询取消点赞操作
     */
    @PutMapping("/cancel-like")
    @UserLoginToken
    public Response pressCancelLike(@RequestParam("pressId") Integer pressId, HttpServletRequest httpServletRequest) {
        // 从请求头中取出token
        String token = httpServletRequest.getHeader("Authorization");
        // 从token中取出的uid，不需要担心是否为null，因为@UserLoginToken注解已经验证过了
        int uid = Integer.parseInt(JWT.decode(token).getAudience().get(0));

        // 调用接口给咨询点赞
        pressService.pressCancelLike(pressId, uid);

        // 返回成功消息给前端
        return Response.build(ResponseCode.SUCCESS);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/5 20:47
     * @description ：发表评论 (成功返回1，否则返回0)
     */
    @PostMapping("/publishComment")
    @UserLoginToken
    public Response publishComment(@RequestBody Comment comment, HttpServletRequest httpServletRequest) {
        // 从请求头中取出token
        String token = httpServletRequest.getHeader("Authorization");
        // 从token中取出的uid，不需要担心是否为null，因为@UserLoginToken注解已经验证过了
        int uid = Integer.parseInt(JWT.decode(token).getAudience().get(0));

        // 将请求头中的uid存入
        comment.setUid(uid);

        // 调用接口发布话题
        pressService.addComment(comment);

        // 返回成功消息给前端
        return Response.build(ResponseCode.SUCCESS);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/21 19:23
     * @description ：搜索（全文检索）/ 可分页查询
     */
    @GetMapping("/search")
    @PassToken
    public Response searchPress(@RequestParam("searchValue") String searchValue,
                                @RequestParam(required = false) Integer pageNum,
                                @RequestParam(required = false) Integer pageSize) {

        // 搜索（全文检索）- 获取总数total
        int searchPressTotal = pressService.getSearchPressTotal(searchValue);

        // 在数据中进行搜索（全文检索）
        List<Press> pressList = pressService.searchPress(searchValue,pageNum,pageSize);

        // 将数据封装一下
        Map<String, Object> map = new HashMap<>();
        map.put("total", searchPressTotal);
        map.put("rows", pressList);

        // 返回 数据 给前端
        return Response.build(ResponseCode.SUCCESS, map);
    }
}
